home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / distutils / command / bdist_rpm.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  13KB  |  385 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. """distutils.command.bdist_rpm
  5.  
  6. Implements the Distutils 'bdist_rpm' command (create RPM source and binary
  7. distributions)."""
  8. __revision__ = '$Id: bdist_rpm.py,v 1.46 2004/11/10 22:23:14 loewis Exp $'
  9. import sys
  10. import os
  11. import string
  12. import glob
  13. from types import *
  14. from distutils.core import Command
  15. from distutils.debug import DEBUG
  16. from distutils.util import get_platform
  17. from distutils.file_util import write_file
  18. from distutils.errors import *
  19. from distutils import log
  20.  
  21. class bdist_rpm(Command):
  22.     description = 'create an RPM distribution'
  23.     user_options = [
  24.         ('bdist-base=', None, 'base directory for creating built distributions'),
  25.         ('rpm-base=', None, 'base directory for creating RPMs (defaults to "rpm" under --bdist-base; must be specified for RPM 2)'),
  26.         ('dist-dir=', 'd', 'directory to put final RPM files in (and .spec files if --spec-only)'),
  27.         ('python=', None, 'path to Python interpreter to hard-code in the .spec file (default: "python")'),
  28.         ('fix-python', None, 'hard-code the exact path to the current Python interpreter in the .spec file'),
  29.         ('spec-only', None, 'only regenerate spec file'),
  30.         ('source-only', None, 'only generate source RPM'),
  31.         ('binary-only', None, 'only generate binary RPM'),
  32.         ('use-bzip2', None, 'use bzip2 instead of gzip to create source distribution'),
  33.         ('distribution-name=', None, 'name of the (Linux) distribution to which this RPM applies (*not* the name of the module distribution!)'),
  34.         ('group=', None, 'package classification [default: "Development/Libraries"]'),
  35.         ('release=', None, 'RPM release number'),
  36.         ('serial=', None, 'RPM serial number'),
  37.         ('vendor=', None, 'RPM "vendor" (eg. "Joe Blow <joe@example.com>") [default: maintainer or author from setup script]'),
  38.         ('packager=', None, 'RPM packager (eg. "Jane Doe <jane@example.net>")[default: vendor]'),
  39.         ('doc-files=', None, 'list of documentation files (space or comma-separated)'),
  40.         ('changelog=', None, 'RPM changelog'),
  41.         ('icon=', None, 'name of icon file'),
  42.         ('provides=', None, 'capabilities provided by this package'),
  43.         ('requires=', None, 'capabilities required by this package'),
  44.         ('conflicts=', None, 'capabilities which conflict with this package'),
  45.         ('build-requires=', None, 'capabilities required to build this package'),
  46.         ('obsoletes=', None, 'capabilities made obsolete by this package'),
  47.         ('no-autoreq', None, 'do not automatically calculate dependencies'),
  48.         ('keep-temp', 'k', "don't clean up RPM build directory"),
  49.         ('no-keep-temp', None, 'clean up RPM build directory [default]'),
  50.         ('use-rpm-opt-flags', None, 'compile with RPM_OPT_FLAGS when building from source RPM'),
  51.         ('no-rpm-opt-flags', None, 'do not pass any RPM CFLAGS to compiler'),
  52.         ('rpm3-mode', None, 'RPM 3 compatibility mode (default)'),
  53.         ('rpm2-mode', None, 'RPM 2 compatibility mode'),
  54.         ('prep-script=', None, 'Specify a script for the PREP phase of RPM building'),
  55.         ('build-script=', None, 'Specify a script for the BUILD phase of RPM building'),
  56.         ('pre-install=', None, 'Specify a script for the pre-INSTALL phase of RPM building'),
  57.         ('install-script=', None, 'Specify a script for the INSTALL phase of RPM building'),
  58.         ('post-install=', None, 'Specify a script for the post-INSTALL phase of RPM building'),
  59.         ('pre-uninstall=', None, 'Specify a script for the pre-UNINSTALL phase of RPM building'),
  60.         ('post-uninstall=', None, 'Specify a script for the post-UNINSTALL phase of RPM building'),
  61.         ('clean-script=', None, 'Specify a script for the CLEAN phase of RPM building'),
  62.         ('verify-script=', None, 'Specify a script for the VERIFY phase of the RPM build'),
  63.         ('force-arch=', None, 'Force an architecture onto the RPM build process')]
  64.     boolean_options = [
  65.         'keep-temp',
  66.         'use-rpm-opt-flags',
  67.         'rpm3-mode',
  68.         'no-autoreq']
  69.     negative_opt = {
  70.         'no-keep-temp': 'keep-temp',
  71.         'no-rpm-opt-flags': 'use-rpm-opt-flags',
  72.         'rpm2-mode': 'rpm3-mode' }
  73.     
  74.     def initialize_options(self):
  75.         self.bdist_base = None
  76.         self.rpm_base = None
  77.         self.dist_dir = None
  78.         self.python = None
  79.         self.fix_python = None
  80.         self.spec_only = None
  81.         self.binary_only = None
  82.         self.source_only = None
  83.         self.use_bzip2 = None
  84.         self.distribution_name = None
  85.         self.group = None
  86.         self.release = None
  87.         self.serial = None
  88.         self.vendor = None
  89.         self.packager = None
  90.         self.doc_files = None
  91.         self.changelog = None
  92.         self.icon = None
  93.         self.prep_script = None
  94.         self.build_script = None
  95.         self.install_script = None
  96.         self.clean_script = None
  97.         self.verify_script = None
  98.         self.pre_install = None
  99.         self.post_install = None
  100.         self.pre_uninstall = None
  101.         self.post_uninstall = None
  102.         self.prep = None
  103.         self.provides = None
  104.         self.requires = None
  105.         self.conflicts = None
  106.         self.build_requires = None
  107.         self.obsoletes = None
  108.         self.keep_temp = 0
  109.         self.use_rpm_opt_flags = 1
  110.         self.rpm3_mode = 1
  111.         self.no_autoreq = 0
  112.         self.force_arch = None
  113.  
  114.     
  115.     def finalize_options(self):
  116.         self.set_undefined_options('bdist', ('bdist_base', 'bdist_base'))
  117.         if self.rpm_base is None:
  118.             if not self.rpm3_mode:
  119.                 raise DistutilsOptionError, 'you must specify --rpm-base in RPM 2 mode'
  120.             
  121.             self.rpm_base = os.path.join(self.bdist_base, 'rpm')
  122.         
  123.         if self.python is None:
  124.             if self.fix_python:
  125.                 self.python = sys.executable
  126.             else:
  127.                 self.python = 'python'
  128.         elif self.fix_python:
  129.             raise DistutilsOptionError, '--python and --fix-python are mutually exclusive options'
  130.         
  131.         if os.name != 'posix':
  132.             raise DistutilsPlatformError, "don't know how to create RPM distributions on platform %s" % os.name
  133.         
  134.         if self.binary_only and self.source_only:
  135.             raise DistutilsOptionError, "cannot supply both '--source-only' and '--binary-only'"
  136.         
  137.         if not self.distribution.has_ext_modules():
  138.             self.use_rpm_opt_flags = 0
  139.         
  140.         self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))
  141.         self.finalize_package_data()
  142.  
  143.     
  144.     def finalize_package_data(self):
  145.         self.ensure_string('group', 'Development/Libraries')
  146.         self.ensure_string('vendor', '%s <%s>' % (self.distribution.get_contact(), self.distribution.get_contact_email()))
  147.         self.ensure_string('packager')
  148.         self.ensure_string_list('doc_files')
  149.         if type(self.doc_files) is ListType:
  150.             for readme in ('README', 'README.txt'):
  151.                 if os.path.exists(readme) and readme not in self.doc_files:
  152.                     self.doc_files.append(readme)
  153.                     continue
  154.             
  155.         
  156.         self.ensure_string('release', '1')
  157.         self.ensure_string('serial')
  158.         self.ensure_string('distribution_name')
  159.         self.ensure_string('changelog')
  160.         self.changelog = self._format_changelog(self.changelog)
  161.         self.ensure_filename('icon')
  162.         self.ensure_filename('prep_script')
  163.         self.ensure_filename('build_script')
  164.         self.ensure_filename('install_script')
  165.         self.ensure_filename('clean_script')
  166.         self.ensure_filename('verify_script')
  167.         self.ensure_filename('pre_install')
  168.         self.ensure_filename('post_install')
  169.         self.ensure_filename('pre_uninstall')
  170.         self.ensure_filename('post_uninstall')
  171.         self.ensure_string_list('provides')
  172.         self.ensure_string_list('requires')
  173.         self.ensure_string_list('conflicts')
  174.         self.ensure_string_list('build_requires')
  175.         self.ensure_string_list('obsoletes')
  176.         self.ensure_string('force_arch')
  177.  
  178.     
  179.     def run(self):
  180.         if DEBUG:
  181.             print 'before _get_package_data():'
  182.             print 'vendor =', self.vendor
  183.             print 'packager =', self.packager
  184.             print 'doc_files =', self.doc_files
  185.             print 'changelog =', self.changelog
  186.         
  187.         if self.spec_only:
  188.             spec_dir = self.dist_dir
  189.             self.mkpath(spec_dir)
  190.         else:
  191.             rpm_dir = { }
  192.             for d in ('SOURCES', 'SPECS', 'BUILD', 'RPMS', 'SRPMS'):
  193.                 rpm_dir[d] = os.path.join(self.rpm_base, d)
  194.                 self.mkpath(rpm_dir[d])
  195.             
  196.             spec_dir = rpm_dir['SPECS']
  197.         spec_path = os.path.join(spec_dir, '%s.spec' % self.distribution.get_name())
  198.         self.execute(write_file, (spec_path, self._make_spec_file()), "writing '%s'" % spec_path)
  199.         if self.spec_only:
  200.             return None
  201.         
  202.         sdist = self.reinitialize_command('sdist')
  203.         if self.use_bzip2:
  204.             sdist.formats = [
  205.                 'bztar']
  206.         else:
  207.             sdist.formats = [
  208.                 'gztar']
  209.         self.run_command('sdist')
  210.         source = sdist.get_archive_files()[0]
  211.         source_dir = rpm_dir['SOURCES']
  212.         self.copy_file(source, source_dir)
  213.         if self.icon:
  214.             if os.path.exists(self.icon):
  215.                 self.copy_file(self.icon, source_dir)
  216.             else:
  217.                 raise DistutilsFileError, "icon file '%s' does not exist" % self.icon
  218.         
  219.         log.info('building RPMs')
  220.         rpm_cmd = [
  221.             'rpm']
  222.         if os.path.exists('/usr/bin/rpmbuild') or os.path.exists('/bin/rpmbuild'):
  223.             rpm_cmd = [
  224.                 'rpmbuild']
  225.         
  226.         if self.source_only:
  227.             rpm_cmd.append('-bs')
  228.         elif self.binary_only:
  229.             rpm_cmd.append('-bb')
  230.         else:
  231.             rpm_cmd.append('-ba')
  232.         if self.rpm3_mode:
  233.             rpm_cmd.extend([
  234.                 '--define',
  235.                 '_topdir %s' % os.path.abspath(self.rpm_base)])
  236.         
  237.         if not self.keep_temp:
  238.             rpm_cmd.append('--clean')
  239.         
  240.         rpm_cmd.append(spec_path)
  241.         self.spawn(rpm_cmd)
  242.         if not self.dry_run:
  243.             if not self.binary_only:
  244.                 srpms = glob.glob(os.path.join(rpm_dir['SRPMS'], '*.rpm'))
  245.                 self.move_file(srpms[0], self.dist_dir)
  246.             
  247.             if not self.source_only:
  248.                 rpms = glob.glob(os.path.join(rpm_dir['RPMS'], '*/*.rpm'))
  249.                 debuginfo = glob.glob(os.path.join(rpm_dir['RPMS'], '*/*debuginfo*.rpm'))
  250.                 if debuginfo:
  251.                     rpms.remove(debuginfo[0])
  252.                 
  253.                 self.move_file(rpms[0], self.dist_dir)
  254.                 if debuginfo:
  255.                     self.move_file(debuginfo[0], self.dist_dir)
  256.                 
  257.             
  258.         
  259.  
  260.     
  261.     def _make_spec_file(self):
  262.         '''Generate the text of an RPM spec file and return it as a
  263.         list of strings (one per line).
  264.         '''
  265.         spec_file = [
  266.             '%define name ' + self.distribution.get_name(),
  267.             '%define version ' + self.distribution.get_version().replace('-', '_'),
  268.             '%define release ' + self.release.replace('-', '_'),
  269.             '',
  270.             'Summary: ' + self.distribution.get_description()]
  271.         spec_file.extend([
  272.             'Name: %{name}',
  273.             'Version: %{version}',
  274.             'Release: %{release}'])
  275.         if self.use_bzip2:
  276.             spec_file.append('Source0: %{name}-%{version}.tar.bz2')
  277.         else:
  278.             spec_file.append('Source0: %{name}-%{version}.tar.gz')
  279.         spec_file.extend([
  280.             'License: ' + self.distribution.get_license(),
  281.             'Group: ' + self.group,
  282.             'BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot',
  283.             'Prefix: %{_prefix}'])
  284.         if not self.force_arch:
  285.             if not self.distribution.has_ext_modules():
  286.                 spec_file.append('BuildArch: noarch')
  287.             
  288.         else:
  289.             spec_file.append('BuildArch: %s' % self.force_arch)
  290.         for field in ('Vendor', 'Packager', 'Provides', 'Requires', 'Conflicts', 'Obsoletes'):
  291.             val = getattr(self, string.lower(field))
  292.             if type(val) is ListType:
  293.                 spec_file.append('%s: %s' % (field, string.join(val)))
  294.                 continue
  295.             if val is not None:
  296.                 spec_file.append('%s: %s' % (field, val))
  297.                 continue
  298.         
  299.         if self.distribution.get_url() != 'UNKNOWN':
  300.             spec_file.append('Url: ' + self.distribution.get_url())
  301.         
  302.         if self.distribution_name:
  303.             spec_file.append('Distribution: ' + self.distribution_name)
  304.         
  305.         if self.build_requires:
  306.             spec_file.append('BuildRequires: ' + string.join(self.build_requires))
  307.         
  308.         if self.icon:
  309.             spec_file.append('Icon: ' + os.path.basename(self.icon))
  310.         
  311.         if self.no_autoreq:
  312.             spec_file.append('AutoReq: 0')
  313.         
  314.         spec_file.extend([
  315.             '',
  316.             '%description',
  317.             self.distribution.get_long_description()])
  318.         def_build = '%s setup.py build' % self.python
  319.         if self.use_rpm_opt_flags:
  320.             def_build = 'env CFLAGS="$RPM_OPT_FLAGS" ' + def_build
  321.         
  322.         script_options = [
  323.             ('prep', 'prep_script', '%setup'),
  324.             ('build', 'build_script', def_build),
  325.             ('install', 'install_script', '%s setup.py install --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES' % self.python),
  326.             ('clean', 'clean_script', 'rm -rf $RPM_BUILD_ROOT'),
  327.             ('verifyscript', 'verify_script', None),
  328.             ('pre', 'pre_install', None),
  329.             ('post', 'post_install', None),
  330.             ('preun', 'pre_uninstall', None),
  331.             ('postun', 'post_uninstall', None)]
  332.         for rpm_opt, attr, default in script_options:
  333.             val = getattr(self, attr)
  334.             if val or default:
  335.                 spec_file.extend([
  336.                     '',
  337.                     '%' + rpm_opt])
  338.                 if val:
  339.                     spec_file.extend(string.split(open(val, 'r').read(), '\n'))
  340.                 else:
  341.                     spec_file.append(default)
  342.             val
  343.         
  344.         spec_file.extend([
  345.             '',
  346.             '%files -f INSTALLED_FILES',
  347.             '%defattr(-,root,root)'])
  348.         if self.doc_files:
  349.             spec_file.append('%doc ' + string.join(self.doc_files))
  350.         
  351.         if self.changelog:
  352.             spec_file.extend([
  353.                 '',
  354.                 '%changelog'])
  355.             spec_file.extend(self.changelog)
  356.         
  357.         return spec_file
  358.  
  359.     
  360.     def _format_changelog(self, changelog):
  361.         '''Format the changelog correctly and convert it to a list of strings
  362.         '''
  363.         if not changelog:
  364.             return changelog
  365.         
  366.         new_changelog = []
  367.         for line in string.split(string.strip(changelog), '\n'):
  368.             line = string.strip(line)
  369.             if line[0] == '*':
  370.                 new_changelog.extend([
  371.                     '',
  372.                     line])
  373.                 continue
  374.             if line[0] == '-':
  375.                 new_changelog.append(line)
  376.                 continue
  377.             new_changelog.append('  ' + line)
  378.         
  379.         if not new_changelog[0]:
  380.             del new_changelog[0]
  381.         
  382.         return new_changelog
  383.  
  384.  
  385.